TPaintBox.Invalidate ale jenom zadany kousek

Otázka od: petr palicka

9. 3. 2004 14:06

Ahoj,

   potreboval bych prekreslit TPaintBox, ale
ne cely, nybrz jenom zadanou oblast. Kdyz si
kus TPaintBoxu prekreju jinym oknem a potom
ho presunu jinam, tak se mi krasne vykresli
znovu jenom ta puvodne zakryta oblast.
   Potrebuju totez, ale programove. Neco jako
TPaintBox.InvalidateRect. Nebo by mi stacilo
prekreslit to cely, ale bez blikani. On se
mi ten TPaintBox nejprve smazne a pak teprve
kresli a neni to moc hezky.

dekuji

Peca


Odpovedá: Petr Daricek

9. 3. 2004 14:22

> Ahoj,
>
> potreboval bych prekreslit TPaintBox, ale
> ne cely, nybrz jenom zadanou oblast. Kdyz si
> kus TPaintBoxu prekreju jinym oknem a potom
> ho presunu jinam, tak se mi krasne vykresli
> znovu jenom ta puvodne zakryta oblast.
> Potrebuju totez, ale programove. Neco jako
> TPaintBox.InvalidateRect. Nebo by mi stacilo
> prekreslit to cely, ale bez blikani. On se
> mi ten TPaintBox nejprve smazne a pak teprve
> kresli a neni to moc hezky.
>
> dekuji
>
> Peca

Pouzij

 Windows.InvalidateRect(Handle:THandle;Rect:PRect;EraseBackground:Boolean)

                             Petr Daricek
____________________________________________________________
ADSL za korunu od Contactelu - nejprijemnejsi ADSL na trhu dorucime rychle az k
Vam!
http://ad2.seznam.cz/redir.cgi?instance=70017%26url=http://www.contactel.cz/adsl

Odpovedá: Ondrej Kelle

9. 3. 2004 15:05

> potreboval bych prekreslit TPaintBox, ale
> ne cely, nybrz jenom zadanou oblast. Kdyz si
> kus TPaintBoxu prekreju jinym oknem a potom
> ho presunu jinam, tak se mi krasne vykresli
> znovu jenom ta puvodne zakryta oblast.
> Potrebuju totez, ale programove. Neco jako
> TPaintBox.InvalidateRect. Nebo by mi stacilo
> prekreslit to cely, ale bez blikani. On se
> mi ten TPaintBox nejprve smazne a pak teprve
> kresli a neni to moc hezky.

Na tento ucel sluzi API InvalidateRect, ale TPaintBox je potomok
TGraphicControl, tzn. sam osebe nema window handle - vykresluje sa v ramci
vykreslovania svojho Parenta (TWinControl.PaintHandler - PaintControls).
TWinControl uz v metode PaintHandler vola BeginPaint, cim validuje svoju
update region a tym padom na urovni TGraphicControl ju uz nie je mozne
zistit (GetUpdateRect(Parent.Handle...) vrati False) - tym padom nema velmi
zmysel snazit sa o invalidaciu len nejakej casti. Tieto "lightweight
controls"
boli myslim pisane s tym umyslom, ze sa budu kreslit zakazdym cele
znovu.
Optimalizacia na rychlost/odstranenie blikania sa da dosiahnut pouzitim
offscreen bitmapy: kreslis si do vlastnej bitmapy v pameti podla potreby, v
OnPaint uz len kopirujes hotovu bitmapu na Canvas, to je dost rychla
operacia.

V pripade, ze potrebujes kreslit plne v svojej rezii, myslim, ze by si si
mal odvodit vlastnu kontrolku od TWinControl.

HTH
TOndrej

Odpovedá: petr palicka

9. 3. 2004 16:51


Petr Daricek wrote:
> Windows.InvalidateRect(Handle:THandle;Rect:PRect;EraseBackground:Boolean)

snaha byla, ale nejak mi to nechtelo slapat...


Ondrej Kelle wrote:
> Na tento ucel sluzi API InvalidateRect, ale TPaintBox je potomok
> TGraphicControl, tzn. sam osebe nema window handle - vykresluje
> sa v ramci vykreslovania svojho Parenta (TWinControl.PaintHandler
> - PaintControls).

no jasne, ja to tusil, ale posilal jsem handle formulare.
s handlem parenta to funguje tak jak ma.

   InvalidateRect(pbDrawBox.Parent.Handle, @r, True);

dekuji za spolupraci  

Peca